using Os.Infra;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;

namespace Os.Domain
{
	public class LocalAtendimento
    {
        #region Atributos

        private int _idcLocalAtendimento;
		private string _nome;
		private bool _persisted;
		private bool _modified;

        private const string SPSELECTID = "SP_LocalAtendimentoSelId";
        private const string SPSELECT = "SP_LocalAtendimentoSel";
        private const string SPINSERT = "SP_LocalAtendimentoIns";
        private const string SPUPDATE = "SP_LocalAtendimentoUpd";
        private const string SPDELETE = "SP_LocalAtendimentoDel";

        #endregion Atributos

		public int IdLocalAtendimento
		{
			get
			{
				return this._idcLocalAtendimento;
			}
			set
			{
				this._idcLocalAtendimento = value;
				this._modified = true;
			}
		}
		public string Nome
		{
			get
			{
				return this._nome;
			}
			set
			{
				this._nome = value;
				this._modified = true;
			}
		}
		public LocalAtendimento()
		{
		}
		public LocalAtendimento(int idLocalAtendimento)
		{
			this._idcLocalAtendimento = idLocalAtendimento;
			this._persisted = true;
		}
		private List<MySqlParameter> ObterParametros()
		{
			return new List<MySqlParameter>
			{
				new MySqlParameter("?idLocalatendimento", MySqlDbType.Int32, 11), 
				new MySqlParameter("?nome", MySqlDbType.VarChar, 50)
			};
		}
		private void PreencherParamentros(List<MySqlParameter> parms)
		{
			parms[0].Value = this._idcLocalAtendimento;
			parms[1].Value = this._nome;
			if (!this._persisted)
			{
				parms[0].Direction = ParameterDirection.Output;
			}
			else
			{
				parms[0].Direction = ParameterDirection.Input;
			}
		}
		private void Inserir()
		{
			List<MySqlParameter> parameters = this.ObterParametros();
			this.PreencherParamentros(parameters);
			using (MySqlConnection mySqlConnection = new MySqlConnection(MysqlData.CONN_STRING))
			{
				mySqlConnection.Open();
				try
				{
					MySqlCommand mySqlCommand = MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_LocalAtendimentoIns", parameters);
					this._idcLocalAtendimento = Convert.ToInt32(mySqlCommand.Parameters["?id_LocalAtendimento"].Value);
					mySqlCommand.Parameters.Clear();
					this._persisted = true;
					this._modified = false;
				}
				catch (Exception ex)
				{
					throw ex;
				}
			}
		}
		private void Inserir(MySqlTransaction trans)
		{
			List<MySqlParameter> parameters = this.ObterParametros();
			this.PreencherParamentros(parameters);
			MySqlCommand mySqlCommand = MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_LocalAtendimentoIns", parameters);
			this._idcLocalAtendimento = Convert.ToInt32(mySqlCommand.Parameters["?parIdLocalAtendimento"].Value);
			mySqlCommand.Parameters.Clear();
			this._persisted = true;
			this._modified = false;
		}
		private void Atualizar()
		{
			if (this._modified)
			{
				List<MySqlParameter> parameters = this.ObterParametros();
				this.PreencherParamentros(parameters);
				MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_LocalAtendimentoUpd", parameters);
				this._modified = false;
			}
		}
		private void Atualizar(MySqlTransaction trans)
		{
			if (this._modified)
			{
				List<MySqlParameter> parameters = this.ObterParametros();
				this.PreencherParamentros(parameters);
				MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_LocalAtendimentoUpd", parameters);
				this._modified = false;
			}
		}
		public static void Remover(int idLocalAtendimento)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?parIdLocalAtendimento", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idLocalAtendimento;
			MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_LocalAtendimentoDel", parms);
		}
		public static void Remover(MySqlTransaction trans, int idLocalAtendimento)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?parIdLocalAtendimento", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idLocalAtendimento;
			MySqlCommand mySqlCommand = MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_LocalAtendimentoDel", parms);
			mySqlCommand.Parameters.Clear();
		}
		public void Salvar()
		{
			if (!this._persisted)
			{
				this.Inserir();
			}
			else
			{
				this.Atualizar();
			}
		}
		public void Salvar(MySqlTransaction trans)
		{
			if (!this._persisted)
			{
				this.Inserir(trans);
			}
			else
			{
				this.Atualizar(trans);
			}
		}
		private static void PreencherInstancia(IDataReader dr, LocalAtendimento objLocalAtendimento)
		{
			try
			{
                if (dr["idLocalAtendimento"] != DBNull.Value)
				    objLocalAtendimento._idcLocalAtendimento = Convert.ToInt32(dr["idLocalAtendimento"]);
                if (dr["nome"] != DBNull.Value)
				    objLocalAtendimento._nome = Convert.ToString(dr["nome"]);

				objLocalAtendimento._persisted = true;
				objLocalAtendimento._modified = false;
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public static LocalAtendimento CarregarObjeto(int idLocalAtendimento)
		{
			LocalAtendimento localAtendimento = null;
			using (IDataReader dr = LocalAtendimento.CarregarDados(idLocalAtendimento))
			{
				if (dr.Read())
				{
					localAtendimento = new LocalAtendimento();
					LocalAtendimento.PreencherInstancia(dr, localAtendimento);
				}
                dr.Close();
                dr.Dispose();
			}
			return localAtendimento;
		}
		public static List<LocalAtendimento> CarregarTodos()
		{
			List<LocalAtendimento> locais = new List<LocalAtendimento>();
			using (IDataReader dr = LocalAtendimento.CarregarDados())
			{
				while (dr.Read())
				{
					LocalAtendimento localAtendimento = new LocalAtendimento();
					LocalAtendimento.PreencherInstancia(dr, localAtendimento);
					locais.Add(localAtendimento);
				}
                dr.Close();
                dr.Dispose();
			}
			return locais;
		}
		public void CompletarObjeto()
		{
			using (IDataReader dr = LocalAtendimento.CarregarDados(this._idcLocalAtendimento))
			{
                if (dr.Read())
                {
                    LocalAtendimento.PreencherInstancia(dr, this);
                }
                dr.Close();
                dr.Dispose();
			}
		}
		private static IDataReader CarregarDados(int idLocalAtendimento)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?idLocalAtendimento", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idLocalAtendimento;
			return MysqlData.ExecutarLeitura(CommandType.StoredProcedure, "SP_LocalAtendimentoSelId", parms);
		}
		private static IDataReader CarregarDados()
		{
			return MysqlData.ExecutarLeitura(CommandType.StoredProcedure, "SP_LocalAtendimentoSel", null);
		}
	}
}
